From 794cb93dfd8591ea1af7463255aaced0cd92d737 Mon Sep 17 00:00:00 2001 From: "awilliam@xenbuild2.aw" Date: Wed, 24 Jan 2007 12:16:44 -0700 Subject: [PATCH] [IA64] ptc_ga might not purge vtlb SMP Windows sometimes failed to boot up with BSOD. If VTLB hasn't been used in region 0, ptc_ga for other region doesn't purge VTLBs. Signed-off-by: Kouya Shimura --- xen/arch/ia64/vmx/vmmu.c | 3 ++- xen/arch/ia64/vmx/vtlb.c | 11 ++++++++++- xen/include/asm-ia64/vmmu.h | 1 + 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/xen/arch/ia64/vmx/vmmu.c b/xen/arch/ia64/vmx/vmmu.c index 145cd4c447..d75cc441ca 100644 --- a/xen/arch/ia64/vmx/vmmu.c +++ b/xen/arch/ia64/vmx/vmmu.c @@ -574,7 +574,8 @@ static void ptc_ga_remote_func (void *varg) mpta = ia64_get_pta(); ia64_set_pta(v->arch.arch_vmx.mpta&(~1)); ia64_srlz_d(); - vmx_vcpu_ptc_l(v, REGION_OFFSET(vadr), args->ps); + vadr = PAGEALIGN(vadr, args->ps); + thash_purge_entries_remote(v, vadr, args->ps); VMX(v, vrr[0]) = oldrid; VMX(v, psbits[0]) = oldpsbits; ia64_set_rr(0x0,moldrid); diff --git a/xen/arch/ia64/vmx/vtlb.c b/xen/arch/ia64/vmx/vtlb.c index f85c9e63b4..cb0181b9a0 100644 --- a/xen/arch/ia64/vmx/vtlb.c +++ b/xen/arch/ia64/vmx/vtlb.c @@ -261,7 +261,7 @@ u64 guest_vhpt_lookup(u64 iha, u64 *pte) * purge software guest tlb */ -void vtlb_purge(VCPU *v, u64 va, u64 ps) +static void vtlb_purge(VCPU *v, u64 va, u64 ps) { thash_data_t *cur; u64 start, curadr, size, psbits, tag, rr_ps, num; @@ -442,6 +442,15 @@ void thash_purge_entries(VCPU *v, u64 va, u64 ps) vhpt_purge(v, va, ps); } +void thash_purge_entries_remote(VCPU *v, u64 va, u64 ps) +{ + u64 old_va = va; + va = REGION_OFFSET(va); + if (vcpu_quick_region_check(v->arch.tc_regions, old_va)) + vtlb_purge(v, va, ps); + vhpt_purge(v, va, ps); +} + u64 translate_phy_pte(VCPU *v, u64 *pte, u64 itir, u64 va) { u64 ps, ps_mask, paddr, maddr; diff --git a/xen/include/asm-ia64/vmmu.h b/xen/include/asm-ia64/vmmu.h index 9c436ce0e6..905d122f68 100644 --- a/xen/include/asm-ia64/vmmu.h +++ b/xen/include/asm-ia64/vmmu.h @@ -271,6 +271,7 @@ extern thash_data_t *thash_find_next_overlap(thash_cb_t *hcb); * */ extern void thash_purge_entries(struct vcpu *v, u64 va, u64 ps); +extern void thash_purge_entries_remote(struct vcpu *v, u64 va, u64 ps); extern void thash_purge_and_insert(struct vcpu *v, u64 pte, u64 itir, u64 ifa, int type); /* -- 2.30.2